#===istalismanplugin===
# -*- coding: utf-8 -*-

# $Revision: 56 $
# $Author: rchiganov@gmail.com $
# $Date: 2013-09-23 10:14:38 +0000 (Mon, 23 Sep 2013) $

#---------------------------------------------------------------------------------------------------

import xmpp
import random

#---------------------------------------------------------------------------------------------------

ACCESS_LIST = {
	-100 : u'(Полный игнор)',
	  -1 : u'(Заблокирован)',
	   0 : u'(Никто)',
	  10 : u'(Участник)',
	  11 : u'(Мембер)',
	  15 : u'(Модератор)',
	  16 : u'(Модератор)',
	  20 : u'(Администратор)',
	  30 : u'(Владелец)',
	  80 : u'(Админ бота)',
	 100 : u'(Владелец бота)'
}

ACCESS_PENDING = [ ]

#---------------------------------------------------------------------------------------------------

def access_view ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if not GROUPCHATS.has_key(psource[1]) and len(lparam) != 0:
		reply(ptype, psource, u'в не конференции используй только для определения своего доступа')
		return

	if len(lparam) == 0:
		if not GROUPCHATS.has_key(psource[1]):
			llevel = user_level(psource[1] + '/' + psource[1].split('@')[0], psource[1])
		else:
			llevel = user_level(psource[1] + '/' + psource[2], psource[1])
		reply(ptype, psource, u'Твой доступ = %d %s' % ( llevel, ACCESS_LIST.get(llevel, u'(Unknown)') ))
		return

	llevel = user_level(psource[1] + '/' + psource[2], psource[1])
	if llevel < 20:
		reply(ptype, psource, u'ага, щаззз')
		return

	if lparam[0].count(u'@') > 0:
		llevel = user_level(lparam[0] + '/' + lparam[0].split('@')[0], psource[1])
		reply(ptype, psource, u'Доступ пользователя %s = %d %s' % ( lparam[0], llevel, ACCESS_LIST.get(llevel, u'(Unknown)') ))
	else:
		if GROUPCHATS[psource[1]].has_key(lparam[0]):
			llevel = user_level(psource[1] + '/' + lparam[0], psource[1])
			reply(ptype, psource, u'Доступ пользователя %s = %d %s' % ( lparam[0], llevel, ACCESS_LIST.get(llevel, u'(Unknown)') ))
		else:
			reply(ptype, psource, u'Что-то я не вижу такого!!!')

#---------------------------------------------------------------------------------------------------

def access_viewlist ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if len(lparam) != 0:
		reply(ptype, psource, u'данная команда должна использоваться без параметров... читай хелп по команде')
		return

	laccess = { }
	lanswer = u'>>>\nСписок пользователей с глобальными правами:'
	for litem in GLOBACCESS.keys():
		if not laccess.has_key(GLOBACCESS[litem]):
			laccess[GLOBACCESS[litem]] = []
		laccess[GLOBACCESS[litem]].append(litem)
	for litem in sorted(laccess.keys(), reverse=True):
		lanswer += u'\n    Пользователи с правами %d %s:' % ( litem, ACCESS_LIST.get(litem, u'(Unknown)') )
		lanswer += u'\n        * ' + u'\n        * '.join(sorted(laccess[litem]))

	if GROUPCHATS.has_key(psource[1]) and ACCBYCONFFILE.has_key(psource[1]):
		laccess = { }
		lanswer += u'\nСписок пользователей с локальными правами:'
		for litem in ACCBYCONFFILE[psource[1]].keys():
			if not laccess.has_key(ACCBYCONFFILE[psource[1]][litem]):
				laccess[ACCBYCONFFILE[psource[1]][litem]] = []
			laccess[ACCBYCONFFILE[psource[1]][litem]].append(litem)
		for litem in sorted(laccess.keys(), reverse=True):
			lanswer += u'\n    Пользователи с правами %d %s:' % ( litem, ACCESS_LIST.get(litem, u'(Unknown)') )
			lanswer += u'\n        * ' + u'\n        * '.join(sorted(laccess[litem]))

	if ptype == 'public':
		reply(ptype, psource, u'в привате')
	reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

# Отправляем запрос к серверу на получение информации
def access_conflist ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'эта команда доступна только в конференции...')
		return

	global ACCESS_PENDING

	lrolelist = {
		u'овнеры'  : u'owner',
		u'админы'  : u'admin',
		u'мемберы' : u'member',
		u'банлист' : u'outcast'
	}

	lparam = pparameters.split()
	if len(lparam) != 1:
		reply(ptype, psource, u'что то ты не то пишешь... читай хелп по команде')
		return

	if not lrolelist.has_key(lparam[0]):
		reply(ptype, psource, u'что то ты не то пишешь... читай хелп по команде')
		return

	lrole = lrolelist[lparam[0]]
	liq = xmpp.Iq('get')
	lid = 'item%d' % random.randrange(1000, 9999)

	ACCESS_PENDING.append(lid)

	liq.setTo(psource[1])
	liq.setID(lid)

	lquery = xmpp.Node('query')
	lquery.setNamespace('http://jabber.org/protocol/muc#admin')
	lquery.addChild('item', { 'affiliation': lrole })
	liq.addChild(node=lquery)
	JCON.SendAndCallForResponse(liq, access_conflist_answer, { 'ptype': ptype, 'psource': psource, 'prole': lparam[0] })
	return

# Обрабатываем ответ на отправленный запрос от сервера
def access_conflist_answer ( pcoze, pres, ptype, psource, prole ):
	global ACCESS_PENDING

	lid = pres.getID()
	if lid in ACCESS_PENDING:
		ACCESS_PENDING.remove(lid)
	else:
		reply(ptype, psource, u'что то не так... *SCRATCH*')
		return

	lanswer = u''
	if pres.getType() == 'result':
		lanswer += u'>>>\n Cписок "%s":' % prole

		if len(pres.getChildren()[0].getChildren()) != 0:
			lusers = []
			for litem in pres.getChildren()[0].getChildren():
				lusers.append(litem.getAttrs()['jid'])
			lanswer += u'\n    * ' + u'\n    * '.join(sorted(lusers))
		else:
			lanswer += u' нет никого *PARDON*'

	else:
		lanswer = u'не могу найти... :-('

	if ptype == 'public':
		reply(ptype, psource, u'в привате')
	reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

def access_set_glob ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if len(lparam) not in [ 1, 2 ]:
		reply(ptype, psource, u'что то ты не то пишешь... читай хелп по команде')
		return

	llevel = 0
	if len(lparam) == 2:
		try:
			llevel = int(lparam[1])
		except:
			reply(ptype, psource, u'мая твая не панимать... *CRAZY*')
			return

	if not ACCESS_LIST.has_key(llevel):
		reply(ptype, psource, u'мая твая не панимать... *CRAZY*')
		return

	if lparam[0].count(u'@') > 0:
		if len(lparam) == 1:
			if not GLOBACCESS.has_key(lparam[0]):
				reply(ptype, psource, u'забирать то нечего... *PARDON*')
				return
			change_access_perm_glob(lparam[0])
			reply(ptype, psource, u'забрала')

		else:
			change_access_perm_glob(lparam[0], llevel)
			reply(ptype, psource, u'дала :-[')

	else:
		if not GROUPCHATS.has_key(psource[1]):
			reply(ptype, psource, u'это возможно только в конференции')
			return

		if not GROUPCHATS[psource[1]].has_key(lparam[0]):
			reply(ptype, psource, u'а он тут? :-O')
			return

		if GROUPCHATS[psource[1]][lparam[0]]['ishere'] == 0:
			reply(ptype, psource, u'а он тут? :-O')
			return

		ljid = get_true_jid(psource[1]+'/' + lparam[0])
		if len(lparam) == 1:
			if not GLOBACCESS.has_key(ljid):
				reply(ptype, psource, u'забирать то нечего... *PARDON*')
				return
			change_access_perm_glob(ljid)
			reply(ptype, psource, u'забрала')

		else:
			change_access_perm_glob(ljid, llevel)
			reply(ptype, psource, u'дала :-[')

#---------------------------------------------------------------------------------------------------

def access_set_loc ( ptype, psource, pparameters ):
	if not GROUPCHATS.has_key(psource[1]):
		reply(ptype, psource, u'это возможно только в конференции')
		return

	lparam = pparameters.split()
	if len(lparam) not in [ 1, 2 ]:
		reply(ptype, psource, u'что то ты не то пишешь... читай хелп по команде')
		return

	llevel = 0
	if len(lparam) == 2:
		try:
			llevel = int(lparam[1])
		except:
			reply(ptype, psource, u'мая твая не панимать... *CRAZY*')
			return

	if not ACCESS_LIST.has_key(llevel) or llevel > 30:
		reply(ptype, psource, u'мая твая не панимать... *CRAZY*')
		return

	if lparam[0].count(u'@') > 0:
		if len(lparam) == 1:
			if not ACCBYCONFFILE[psource[1]].has_key(lparam[0]):
				reply(ptype, psource, u'забирать то нечего... *PARDON*')
				return
			change_access_perm(psource[1], lparam[0])
			reply(ptype, psource, u'забрала')

		else:
			change_access_perm(psource[1], lparam[0], llevel)
			reply(ptype, psource, u'дала :-[')

	else:
		if not GROUPCHATS[psource[1]].has_key(lparam[0]):
			reply(ptype, psource, u'а он тут? :-O')
			return

		if GROUPCHATS[psource[1]][lparam[0]]['ishere'] == 0:
			reply(ptype, psource, u'а он тут? :-O')
			return

		ljid = get_true_jid(psource[1]+'/' + lparam[0])
		if len(lparam) == 1:
			if not ACCBYCONFFILE[psource[1]].has_key(ljid):
				reply(ptype, psource, u'забирать то нечего... *PARDON*')
				return
			change_access_perm(psource[1], ljid)
			reply(ptype, psource, u'забрала')

		else:
			change_access_perm(psource[1], ljid, llevel)
			reply(ptype, psource, u'дала :-[')

#---------------------------------------------------------------------------------------------------

register_command_handler(access_view, 'доступ', [ 'доступ', 'админ', 'все' ], 0, """Показывает уровень доступа определённого ника.
Уровни доступа:
-100 - абсолютное игнорирование, все сообщения будут пропускатся на уровне ядра
  -1 - не сможет сделать ничего
   0 - очень ограниченное количество команд и макросов (Никто)
  10 - стандартный набор команд и макросов (Участник)
  11 - расширенный набор команд и макросов (Мембер)
  15 - набор команд и макросов для модераторов (Модератор)
  16 - набор команд и макросов для модераторов (Модератор)
  20 - набор команд и макросов для администраторов (Администратор)
  30 - набор команд и макросов для владельца (Владелец)
  80 - набор команд для администратора бота (Админ бота)
 100 - владелец бота, может всё (Владелец бота)
Параметры:
без параметров - показывает уровень доступа пользователя, который ввёл команду
ник юзера - указывает уровень доступа пользователя с указанным ником (доступна пользователям с уровнем доступа 20+)""", 'доступ [ник]', [ 'доступ', 'доступ guy' ])

register_command_handler(access_viewlist, 'доступы', [ 'доступ', 'админ', 'все' ], 30, 'Показать все глобальные и локальные доступы', 'доступы', [ 'доступы' ])

register_command_handler(access_conflist, 'юзерлист', [ 'доступ', 'админ', 'все' ], 20, """Показывает в зависимости от выбранного ключа список юзеров конференции.
Параметры:
* овнеры - список овнеров конференции
* админы - список админов
* мемберы - список пользователей
* банлист - список забаненных""", 'юзерлист <параметр>', [ 'юзерлист админы', 'юзерлист овнеры' ])

register_command_handler(access_set_glob, 'глобдоступ', [ 'доступ', 'админ', 'все' ], 100, """Устанавливает или снимает (если ник писать без уровня) уровень доступа для определённого ника на определённый уровень. Поддерживаются только ники без пробела.
Уровни доступа:
-100 - абсолютное игнорирование, все сообщения будут пропускатся на уровне ядра
  -1 - не сможет сделать ничего
   0 - очень ограниченное количество команд и макросов (Никто)
  10 - стандартный набор команд и макросов (Участник)
  11 - расширенный набор команд и макросов (Мембер)
  15 - набор команд и макросов для модераторов (Модератор)
  16 - набор команд и макросов для модераторов (Модератор)
  20 - набор команд и макросов для администраторов (Администратор)
  30 - набор команд и макросов для владельца (Владелец)
  80 - набор команд для администратора бота (Админ бота)
 100 - администратор бота, может всё""", 'глобдоступ <ник> [уровень]', [ 'глобдоступ guy 100', 'глобдоступ guy' ])

register_command_handler(access_set_loc, 'локдоступ', [ 'доступ', 'админ', 'все' ], 30, """Устанавливает или снимает (если ник писать без уровня) уровень доступа для определённого ника на определённый уровень. Поддерживаются только ники без пробела.
-100 - абсолютное игнорирование, все сообщения будут пропускатся на уровне ядра
  -1 - не сможет сделать ничего
   0 - очень ограниченное количество команд и макросов (Никто)
  10 - стандартный набор команд и макросов (Участник)
  11 - расширенный набор команд и макросов (Мембер)
  15 - набор команд и макросов для модераторов (Модератор)
  16 - набор команд и макросов для модераторов (Модератор)
  20 - набор команд и макросов для администраторов (Администратор)
  30 - набор команд и макросов для владельца (Владелец)""", 'локдоступ <ник> [уровень]', [ 'локдоступ guy 30', 'локдоступ guy -100' ])

#---------------------------------------------------------------------------------------------------
